package integral

import (
	"context"
	"fmt"
	"time"

	"mall/common/resultx"
	"mall/service/backend/common/errorx"
	"mall/service/backend/common/i18n"
	"mall/service/user/rpc/internal/svc"
	"mall/service/user/rpc/types/user"

	"github.com/sirupsen/logrus"
	"github.com/zeromicro/go-zero/core/logx"
)

type UpdateIntegralTransactionLogLogic struct {
	ctx    context.Context
	svcCtx *svc.ServiceContext
	logx.Logger
}

func NewUpdateIntegralTransactionLogLogic(ctx context.Context, svcCtx *svc.ServiceContext) *UpdateIntegralTransactionLogLogic {
	return &UpdateIntegralTransactionLogLogic{
		ctx:    ctx,
		svcCtx: svcCtx,
		Logger: logx.WithContext(ctx),
	}
}

func (l *UpdateIntegralTransactionLogLogic) UpdateIntegralTransactionLog(in *user.IntegralTransactionLogInfo) (*user.BaseResp, error) {
	tx, err := l.svcCtx.DB.BeginTx(l.ctx, nil)
	if err != nil {
		return nil, resultx.StatusError(resultx.DB_ERROR, "")
	}

	if len(in.Ids) > 0 && in.Status != nil { // 批量修改状态
		now := time.Now()
		for _, id := range in.Ids {
			if id > 0 {
				log, err := l.svcCtx.CurrentUser.FindOneNoCacheIntegralTransactionLog(l.ctx, tx, id)
				if err != nil {
					tx.Rollback()
					logrus.Info(fmt.Sprintf("UpdateIntegralTransactionLog FindOneNoCacheIntegralTransactionLog err: %+v", err))
					return nil, err
				}

				log.Status = uint16(*in.Status)
				log.UpdatedAt = now
				err = l.svcCtx.CurrentUser.UpdateIntegralTransactionLog(l.ctx, tx, log)
				if err != nil {
					tx.Rollback()
					logrus.Info(fmt.Sprintf("UpdateIntegralTransactionLog UpdateIntegralTransactionLog err: %+v", err))
					return nil, err
				}
			}
		}
		tx.Commit()

		return &user.BaseResp{
			Msg: i18n.UpdateSuccess,
		}, nil
	}

	//todo:目前用不上，以后再加
	if in.Id == nil || *in.Id == 0 {
		return nil, errorx.NewInvalidArgumentError(i18n.ValidationError)
	}
	id := *in.Id
	log, err := l.svcCtx.CurrentUser.FindOneNoCacheIntegralTransactionLog(l.ctx, tx, id)
	if err != nil {
		logrus.Info(fmt.Sprintf("UpdateIntegralTransactionLog UpdateIntegralTransactionLog err: %+v", err))
		return nil, err
	}

	if in.UserName != nil && len(*in.UserName) > 0 {
		log.UserName = *in.UserName
	}

	if in.ProductName != nil && len(*in.ProductName) > 0 {
		log.ProductName = *in.ProductName
	}

	if in.Sku != nil && len(*in.Sku) > 0 {
		log.Sku = *in.Sku
	}

	if in.Url != nil && len(*in.Url) > 0 {
		log.URL = *in.Url
	}

	err = l.svcCtx.CurrentUser.UpdateIntegralTransactionLog(l.ctx, nil, log)
	if err != nil {
		logrus.Info(fmt.Sprintf("UpdateIntegralTransactionLog UpdateIntegralTransactionLog err: %+v", err))
		return nil, err
	}

	return &user.BaseResp{
		Msg: i18n.UpdateSuccess,
	}, nil
}
